
import java.util.ArrayList;
import java.util.HashMap;

public class Trame {

	/**
	 * Trame. 16 channels, 48 symbols, 
	 * Pour les tableaux : k = slot		f = channel
	 * 
	 * Doc :  http://www.wimaxforum.org/technology/downloads/Mobile_WiMAX_Part1_Overview_and_Performance.pdf
	 * 
	 */

	public int Preambule[];			// Préambule : Toutes les fréquences, longueur K
	public ArrayList<Integer> FCH ; 	// Frame Control Header
	//
	protected HashMap<Integer, Integer> DL_map; // id_conn et nb de data 
	protected HashMap<Integer, Integer> UL_map; // id_conn et nb de data 

	public int TTG[];				// Blanc de longueur K entre DL_sub-frame et UL_sub-frame
	public int RTG[];				// Blanc entre les trames

	public int max_dl_ul_map_size=500;

	public String Ranging_Sub_Channel[][];
	
	public ArrayList<Integer> ul_transfert_fini; // modelise la partie ou les clients ecriront qu'ils on fini de transmettre des donnes

	//===========================================================================


	public Trame() {	// Pour les nouvelles trames. On change DL_map et UL_map
		//Ranging_subCh est aussi reinitialisé, tout comme la longueur du TTG.

		//this.Ranging_Sub_Channel = new String[UL_map.size()] [];	// Construit un Ranging_subCh de la longueur de UL_sub-frame
		//this.TTG = new int[48 - (DL_map.size() + UL_map.size())];	// Taille du Blanc : longueur restante
		this.Ranging_Sub_Channel = new String[this.max_dl_ul_map_size][this.max_dl_ul_map_size];

		this.DL_map=new HashMap<Integer, Integer>();
		this.UL_map=new HashMap<Integer, Integer>();
		this.FCH = new ArrayList<Integer>();
		this.ul_transfert_fini = new ArrayList<Integer>();// burst
	}

	//===========================================================================
	public void setUL_map(HashMap<Integer, Integer> map) {		// Set UL_map

		this.UL_map = map;
	}

	public void setDL_map(HashMap<Integer, Integer> map) {		// Set UL_map

		this.DL_map = map;
	}

	public HashMap<Integer, Integer> get_UL_map() {		// Get all UL_map

		return this.UL_map;
	}
	public HashMap<Integer, Integer> get_DL_map() {		// Get all DL_map

		return this.DL_map;
	}

	public int get_UL_map_size(){

		return this.get_UL_map().size();
	}

	public int get_DL_map_size(){

		return this.get_DL_map().size();
	}

//===========================================================================
	public void set_FCH(ArrayList<Integer> arr){// met les clients en collisions à la trame precedente

		this.FCH.addAll(arr);
	}
//===========================================================================
	public ArrayList<Integer> get_FCH(){ // get le tab fch

		return this.FCH;
	}
//===========================================================================
	public boolean write_RangingSubCh(int slot, String empreinte) { // transmission sur SRC

		for (int c=0; c < Utils.cdmamax ; c++ ) {
			if (Ranging_Sub_Channel[slot][c] == null){
				Ranging_Sub_Channel[slot][c] = empreinte;     // On écrit la demande du client
				return true;	//OK
			}
		}
		return false; //plus de place

	}
//===========================================================================
}
